#include "MenuDeslizante.h"
#include <iostream>

#if INSTALANDO
#define PATH_RES PATH_RESOURCES
#else
#define PATH_RES "../Resources/"
#endif

MenuDeslizante::MenuDeslizante(vector <string> vector, int posx, int posy, int w, int h, unsigned int p) {
	v_elementos = vector;
    x = posx;
    y = posy;
    camara.x = 0;
    camara.y = 0;
    camara.w = w;
    camara.h = h;
    string path_res = PATH_RES;
    font14 =  TTF_OpenFont( (path_res+"fontArial.ttf").c_str(), 14 );
    paso = p;
    seleccionado = 0;

    arriba = new Boton(posx+w, y, 15, 15, "w", 0, 100 );       //OJO!HARDCODE
    abajo = new Boton(posx+w, y+h-15, 15, 15, "s", 0, 101 );  //OJO!HARDCODE
}

vector<string> MenuDeslizante::getElementos() {
	return v_elementos;
}

void MenuDeslizante::setElementos(vector<string> vect){

	v_elementos = vect;
}

int MenuDeslizante::getX() {
	return x;
}

int MenuDeslizante::getY() {
	return y;
}

int MenuDeslizante::getAncho() {
    return camara.w;
}

int MenuDeslizante::getAlto() {
	return camara.h;
}

Boton* MenuDeslizante::getArriba() {
	return arriba;
}

Boton* MenuDeslizante::getAbajo() {
	return abajo;
}
unsigned int MenuDeslizante::getPaso() {
	return paso;
}

vector<InfoPersonaje*> MenuDeslizante::getPersonajes() {
	return v_personajes;
}

int MenuDeslizante::getCuadro() {
	return cuadro;
}

int MenuDeslizante::getIdImagen() {
	return idImagen;
}

void MenuDeslizante::setCuadro(int num) {
	cuadro=num;
}

void MenuDeslizante::setIdImagen(int num) {
	idImagen=num;
}

void MenuDeslizante::setPersonajes(vector<InfoPersonaje*> vect) {
	v_personajes = vect;
}

void MenuDeslizante::setPaso(unsigned int p) {
	paso = p;
}

SDL_Rect MenuDeslizante::getCamara() {
	return camara;
}

SDL_Rect* MenuDeslizante::getpCamara() {
	return &camara;
}

TTF_Font* MenuDeslizante::getFont14() {
	return font14;
}

unsigned int MenuDeslizante::getSeleccionado() {
	return seleccionado;
}

void MenuDeslizante::setSeleccionado(unsigned int selec) {
	seleccionado = selec;
}

void MenuDeslizante::dibujarDeslizante(SDL_Surface* superficie, unsigned int solapa, unsigned int modo) {

	SDL_Surface* borde = SDL_CreateRGBSurface(0, camara.w + 2, camara.h + 2, 32, 255, 255, 255, 0 );
	SDL_FillRect(borde, NULL, SDL_MapRGB(borde->format, 0, 0, 0));
	SDL_Surface* menuD;
	if ((getElementos().size() * 20) < camara.h) {
		menuD = SDL_CreateRGBSurface(0, camara.w,  camara.h , 32, 255, 255, 255, 0 );    //OJO! HARDCODE
	} else {
		menuD = SDL_CreateRGBSurface(0, camara.w,  (getElementos().size() * 20) , 32, 255, 255, 255, 0 );    //OJO! HARDCODE
	}

	SDL_FillRect(menuD, NULL, SDL_MapRGB(menuD->format, 255, 255, 255));
	SDL_Surface* mensaje;
	SDL_Surface* seleccion = SDL_CreateRGBSurface(0, camara.w, 20 , 32, 255, 255, 255, 0 );   //OJO! HARDCODE
	SDL_FillRect(seleccion, NULL, SDL_MapRGB(seleccion->format, 170, 170, 170));
	SDL_Surface* reborde = SDL_CreateRGBSurface(0, 17, camara.h+2 , 32, 255, 255, 255, 0 );     //OJO! HARDCODE
	SDL_FillRect(reborde, NULL, SDL_MapRGB(reborde->format, 0, 0, 0));
	SDL_Surface* medio = SDL_CreateRGBSurface(0, 15, camara.h-30 , 32, 255, 255, 255, 0 );     //OJO! HARDCODE
	SDL_FillRect(medio, NULL, SDL_MapRGB(medio->format, 240, 240, 240));
	SDL_Color black = { 0, 0, 0 };

	for (unsigned int i=0; i < v_elementos.size(); i++) {

		if (i == getSeleccionado()) {
			insertar_imagen(0, (i * 20), seleccion, menuD);
		}

		mensaje = TTF_RenderText_Solid( getFont14(), getElementos().at(i).c_str(), black );
		insertar_imagen(0, (i * 20), mensaje, menuD);
		SDL_FreeSurface(mensaje);

	}

	if ( (solapa == 0 && modo == 1) || (solapa == 0 && modo == 0 && paso == 1)) {
		//Descripcion del personaje
		stringstream ss1, ss2;
		string s;

		SDL_Surface* nombre = TTF_RenderText_Solid( getFont14(), (getPersonajes().at(getSeleccionado())->nombre).c_str(), black );
		ss1 << "Salto: " << getPersonajes().at(getSeleccionado())->salto;
		s = ss1.str();
		SDL_Surface* salto = TTF_RenderText_Solid( getFont14(), s.c_str(), black );
		ss2 << "Velocidad: " << getPersonajes().at(getSeleccionado())->velocidad;
		s = ss2.str();	
		SDL_Surface* velocidad =  TTF_RenderText_Solid( getFont14(), s.c_str(), black );

		insertar_imagen( getX(), getY() + getAlto() + 10, nombre, superficie);
		insertar_imagen( getX(), getY() + getAlto() + 30, velocidad, superficie);
		insertar_imagen( getX(), getY() + getAlto() + 50, salto, superficie);

		SDL_FreeSurface(nombre);
		SDL_FreeSurface(salto);
		SDL_FreeSurface(velocidad);
		
	}

	insertar_imagen( arriba->getX() - 1, arriba->getY()-1, reborde, superficie);    //OJO! HARDCODE
	insertar_imagen( arriba->getX(), arriba->getY() + 15, medio, superficie);    //OJO! HARDCODE
	arriba->dibujarBoton(superficie);
	abajo->dibujarBoton(superficie);
    insertar_imagen( getX() - 1, getY() - 1, borde, superficie);
	insertar_imagen( getX(), getY(), menuD, superficie, &camara);


	SDL_FreeSurface(medio);
	SDL_FreeSurface(reborde);
	SDL_FreeSurface(borde);
	SDL_FreeSurface(menuD);
	SDL_FreeSurface(seleccion);
}

void MenuDeslizante::handleDeslizante(SDL_Event event, int s_x, int s_y, unsigned int* estado){

	 int x = 0, y = 0;

		abajo->handleBoton(event, s_x, s_y, &camara, v_elementos.size());
		arriba->handleBoton(event, s_x, s_y, &camara, v_elementos.size());

	    if ( event.type == SDL_MOUSEBUTTONDOWN )
	    {
	        if( event.button.button == SDL_BUTTON_LEFT )
	        {

	            x = event.button.x;
	            y = event.button.y;
	        	if( ( x > getX() + s_x ) &&
	        	    ( x < getX() + s_x + getAncho() ) &&
	        		( y > getY() + s_y ) &&
	        		( y < getY() + s_y + getAlto() ) ) {

	        		int pos=0;

	        		for (unsigned int j=0; j < getElementos().size(); j++ ) {
	        			if (( (j * 20) <= camara.y ) && (((j + 1) * 20 ) > camara.y) ) {
	        				pos = j;
	        			}
	        		}
					
                    int v_mitad=20;

        			if ( camara.y > 0 ) {
        				v_mitad = ((20 * (pos+1)) - camara.y);
        			}
                    int cant_elem = getElementos().size();

	        		for ( int i=0; i < cant_elem; i++ ) {

                        if (i == 0 || i == 1 ) {
                        	if ( ( (i * v_mitad) + getY() + s_y <= y ) && (y < (v_mitad + (20*i) + getY() + s_y) ) ) {
                        		setSeleccionado(pos);
                        	}
                        } else {
                        	if ( (y >= (v_mitad + (20*(i-1)) + getY() + s_y)) && ( y < (v_mitad + (20*(i-1)) + getY() + s_y + 20) ) ) {
                        		setSeleccionado(pos);
                        	}

                        }

	        			pos++;
	        		}

	        	}
            }
	    }
	    
		SDL_GetMouseState(&x, &y);

	    if( event.type == SDL_KEYDOWN ) {

	    	if ( event.key.keysym.sym == SDLK_UP )
	    	{

				if( ( x > getX() + s_x ) &&
	        	    ( x < getX() + s_x + getAncho() ) &&
	        		( y > getY() + s_y ) &&
	        		( y < getY() + s_y + getAlto() ) ) {

					if ((camara.y) > 0) {
						(camara.y)--;
					}
				}
	    	}

	    	if ( event.key.keysym.sym == SDLK_DOWN )
	    	{
				if( ( x > getX() + s_x ) &&
	        	    ( x < getX() + s_x + getAncho() ) &&
	        		( y > getY() + s_y ) &&
	        		( y < getY() + s_y + getAlto() ) ) {
					
					if ((camara.y) < ((v_elementos.size() * 20) - camara.h ) &&
					(((v_elementos.size() * 20) > camara.h )) ) {
						(camara.y)++;
					}
				}
	    	}
	    }

}
